package yt.demo.appcorebasic.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import yt.demo.appcorebasic.annotation.DeleteCache;

import java.util.Set;

@Aspect
@Component
public class CacheEvictionAspect {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate; // Redis 操作类

    @Autowired
    private CacheManager cacheManager; // Spring 缓存管理器

    // 定义一个切点：拦截标注了 @DeleteCache 注解的方法
    @Pointcut("@annotation(deleteCache)")
    public void deleteCachePointcut(DeleteCache deleteCache) {
    }

    // 在方法执行前执行模糊删除缓存的操作
    @Before("deleteCachePointcut(deleteCache)")
    public void evictCache(DeleteCache deleteCache) {
        String cachePattern = deleteCache.value();  // 获取缓存名称模式，例如 "system:dict:*"
        // 如果是 Redis 缓存，通过 RedisTemplate 执行模糊删除
        evictCacheByPattern(cachePattern);
    }

    // 通过缓存名称模式删除 Redis 中的缓存
    private void evictCacheByPattern(String pattern) {
        // 使用 Redis 的 keys 命令查找匹配的缓存键
        Set<String> keys = redisTemplate.keys(pattern);  // 模糊匹配符合模式的所有缓存键
        if (keys != null && !keys.isEmpty()) {
            // 删除所有符合条件的缓存键
            redisTemplate.delete(keys);
        }
    }
}
